package com.xyy.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xyy.common.PageResult;
import com.xyy.dto.DoctorQueryDTO;
import com.xyy.entity.Doctor;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 医生服务接口
 */
public interface DoctorService extends IService<Doctor> {

    /**
     * 医生注册
     */
    Map<String, Object> register(Doctor doctor);

    /**
     * 获取所有医院名称列表（用于医生注册时选择）
     */
    List<String> getAllHospitalNames();

    /**
     * 医生登录
     */
    Map<String, Object> login(Doctor doctor);

    /**
     * 发送邮箱验证码
     */
    void sendEmailCode(String email, String username);

    /**
     * 密码重置
     */
    void resetPassword(Doctor doctor);

    /**
     * 根据用户名查询医生
     */
    Doctor getDoctorByUsername(String username);

    /**
     * 根据邮箱查询医生
     */
    Doctor getDoctorByEmail(String email);

    /**
     * 根据手机号查询医生
     */
    Doctor getDoctorByPhone(String phone);

    /**
     * 更新医生最后登录信息
     */
    void updateLastLoginInfo(Long doctorId, String ip);

    /**
     * 验证用户名和邮箱是否匹配
     */
    void validateDoctorEmail(String username, String email);

    /**
     * 验证邮箱验证码
     */
    boolean verifyEmailCode(String username, String email, String emailCode);

    /**
     * 更新医生头像
     */
    void updateDoctorAvatar(Long doctorId, String avatarUrl);

    /**
     * 根据用户名获取医生信息（密码找回用）
     */
    Doctor getDoctorInfoForReset(String username);

    /**
     * 根据用户名获取邮箱（密码找回用）
     */
    String getEmailByUsername(String username);

    /**
     * 上传头像
     */
    String uploadAvatar(Long doctorId, String filename, byte[] fileBytes) throws IOException;

    /**
     * 创建医生（管理员使用）
     */
    void createDoctor(Doctor createDTO);

    /**
     * 更新医生信息（管理员使用）
     */
    void updateDoctor(Doctor doctor);

    /**
     * 软删除医生
     */
    void deleteDoctor(Long doctorId);

    /**
     * 批量软删除医生
     */
    void batchDeleteDoctor(List<Long> doctorIds);

    /**
     * 恢复已删除的医生
     */
    void restoreDoctor(Long doctorId);

    /**
     * 分页查询医生
     */
    PageResult<Doctor> pageQuery(Doctor doctor, Integer current, Integer size);

    /**
     * 管理员分页查询医生（支持按医院名称过滤）
     */
    PageResult<Doctor> pageQueryForAdmin(DoctorQueryDTO queryDTO, Integer current, Integer size);

    /**
     * 分页查询已删除的医生
     */
    PageResult<Doctor> pageQueryDeleted(Integer current, Integer size);

    /**
     * 获取已删除医生列表
     */
    List<Doctor> getDeletedDoctors();

    /**
     * 统计已删除医生总数
     */
    Long countDeletedDoctors();
} 

 